
using System;
using System.Text;
using SpotifyGenNHibernate.CEN;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;
using NHibernate.Exceptions;
using SpotifyGenNHibernate.EN.Spotify;

namespace SpotifyGenNHibernate.CAD.Spotify
{
        public partial class UsuarioCAD : BasicCAD, IUsuarioCAD
        {
        public UsuarioCAD() : base ()
        {
        }

        public UsuarioCAD(ISession sessionAux) : base (sessionAux)
        {
        }



        public UsuarioEN ReadOIDDefault (String Nombre)
        {
                UsuarioEN usuarioEN = null;

                try
                {
                        SesssionInitializeTransaction ();
                        usuarioEN = (UsuarioEN)session.Load (typeof(UsuarioEN),
                                Nombre

                                );
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }

                return usuarioEN;
        }


        public String Registrarse (UsuarioEN usuario)
        {
                try
                {
                        SesssionInitializeTransaction ();
                        if (usuario.ColaReproduccion != null) {
                                usuario.ColaReproduccion = (SpotifyGenNHibernate.EN.Spotify.ColaReproduccionEN)session.Load (typeof(SpotifyGenNHibernate.EN.Spotify.ColaReproduccionEN), usuario.ColaReproduccion.IdCola);
                        }

                        session.Save (usuario);
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }

                return usuario.Nombre;
        }

        public void BorrarUsuario (String Nombre)
        {
                try
                {
                        SesssionInitializeTransaction ();
                        UsuarioEN usuarioEN = (UsuarioEN)session.Load (typeof(UsuarioEN),
                                Nombre

                                );
                        session.Delete (usuarioEN);
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }
        }

        public void EditarUsuario (UsuarioEN usuario)
        {
                try
                {
                        SesssionInitializeTransaction ();
                        UsuarioEN usuarioEN = (UsuarioEN)session.Load (typeof(UsuarioEN), usuario.Nombre);

                        usuarioEN.Contrasena = usuario.Contrasena;


                        usuarioEN.Tipo = usuario.Tipo;

                        session.Update (usuarioEN);
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }
        }
        public void ComprarCancion (String p_Usuario_OID, System.Collections.Generic.IList<int> p_cancion_OIDs)
        {
                SpotifyGenNHibernate.EN.Spotify.UsuarioEN usuarioEN = null;
                try
                {
                        SesssionInitializeTransaction ();
                        usuarioEN = (UsuarioEN)session.Load (typeof(UsuarioEN), p_Usuario_OID);
                        SpotifyGenNHibernate.EN.Spotify.CancionEN cancionEN = null;
                        if (usuarioEN.Cancion == null) {
                                usuarioEN.Cancion = new System.Collections.Generic.List<EN.Spotify.CancionEN>();
                        }

                        foreach (int item in p_cancion_OIDs) {
                                cancionEN = new EN.Spotify.CancionEN ();
                                cancionEN = (EN.Spotify.CancionEN)session.Load (typeof(EN.Spotify.CancionEN), item);
                                usuarioEN.Cancion.Add (cancionEN);
                        }


                        session.Update (usuarioEN);
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }
        }

        public void EscucharColaReproduccion (String p_Usuario_OID, int p_colaReproduccion_OID)
        {
                SpotifyGenNHibernate.EN.Spotify.UsuarioEN usuarioEN = null;
                try
                {
                        SesssionInitializeTransaction ();
                        usuarioEN = (UsuarioEN)session.Load (typeof(UsuarioEN), p_Usuario_OID);
                        usuarioEN.ColaReproduccion = (EN.Spotify.ColaReproduccionEN)session.Load (typeof(EN.Spotify.ColaReproduccionEN), p_colaReproduccion_OID);

                        SpotifyGenNHibernate.EN.Spotify.ColaReproduccionEN colaReproduccionEN = (ColaReproduccionEN)session.Load (typeof(ColaReproduccionEN), p_colaReproduccion_OID);
                        colaReproduccionEN.Usuario = usuarioEN;

                        session.Update (usuarioEN);
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }
        }

        public void EscucharRadio (String p_Usuario_OID, System.Collections.Generic.IList<String> p_radio_OIDs)
        {
                SpotifyGenNHibernate.EN.Spotify.UsuarioEN usuarioEN = null;
                try
                {
                        SesssionInitializeTransaction ();
                        usuarioEN = (UsuarioEN)session.Load (typeof(UsuarioEN), p_Usuario_OID);
                        SpotifyGenNHibernate.EN.Spotify.RadioEN radioEN = null;
                        if (usuarioEN.Radio == null) {
                                usuarioEN.Radio = new System.Collections.Generic.List<EN.Spotify.RadioEN>();
                        }

                        foreach (String item in p_radio_OIDs) {
                                radioEN = new EN.Spotify.RadioEN ();
                                radioEN = (EN.Spotify.RadioEN)session.Load (typeof(EN.Spotify.RadioEN), item);
                                usuarioEN.Radio.Add (radioEN);
                        }


                        session.Update (usuarioEN);
                        SessionCommit ();
                }

                catch (Exception ex) {
                        SessionRollBack ();
                        if (ex is ModelException)
                                throw ex;
                        throw new DataLayerException ("Error in UsuarioCAD.", ex);
                }


                finally
                {
                        SessionClose ();
                }
        }
        }
}
